export default interface Cache<K, V> {
    /**
     * 返回缓存容量，{@code 0}表示无大小限制
     *
     * @return 返回缓存容量，{@code 0}表示无大小限制
     */
    capacity(): number;

    /**
     * 缓存失效时长， {@code 0} 表示没有设置，单位毫秒
     *
     * @return 缓存失效时长， {@code 0} 表示没有设置，单位毫秒
     */
    timeout(): number;

    /**
     * 将对象加入到缓存，使用默认失效时长
     *
     * @param key    键
     * @param object 缓存的对象
     * @see Cache#put(Object, Object, long)
     */
    put(key: K, object: V): void;

    /**
     * 将对象加入到缓存，使用指定失效时长<br>
     * 如果缓存空间满了，{@link #prune()} 将被调用以获得空间来存放新对象
     *
     * @param key     键
     * @param object  缓存的对象
     * @param timeout 失效时长，单位毫秒
     */
    put(key: K, object: V, timeout: number): void;

    /**
     * 从缓存中获得对象，当对象不在缓存中或已经过期返回{@code null}
     * <p>
     * 调用此方法时，会检查上次调用时间，如果与当前时间差值大于超时时间返回{@code null}，否则返回值。
     * <p>
     * 每次调用此方法会刷新最后访问时间，也就是说会重新计算超时时间。
     *
     * @param key 键
     * @return 键对应的对象
     * @see #get(Object, boolean)
     */
    get(key: K): V|null;
    /**
     * 从缓存中获得对象，当对象不在缓存中或已经过期返回Func0回调产生的对象
     * <p>
     * 调用此方法时，会检查上次调用时间，如果与当前时间差值大于超时时间返回{@code null}，否则返回值。
     * <p>
     * 每次调用此方法会刷新最后访问时间，也就是说会重新计算超时时间。
     *
     * @param key      键
     * @param supplier 如果不存在回调方法，用于生产值对象
     * @return 值对象
     */
    get(key: K, supplier: Function): V|null;

    /**
     * 从缓存中获得对象，当对象不在缓存中或已经过期返回Func0回调产生的对象
     * <p>
     * 调用此方法时，会检查上次调用时间，如果与当前时间差值大于超时时间返回{@code null}，否则返回值。
     * <p>
     * 每次调用此方法会可选是否刷新最后访问时间，{@code true}表示会重新计算超时时间。
     *
     * @param key                键
     * @param isUpdateLastAccess 是否更新最后访问时间，即重新计算超时时间。
     * @param supplier           如果不存在回调方法，用于生产值对象
     * @return 值对象
     */
// V get(K key, boolean isUpdateLastAccess, Func0<V> supplier);

    /**
     * 从缓存中获得对象，当对象不在缓存中或已经过期返回{@code null}
     * <p>
     * 调用此方法时，会检查上次调用时间，如果与当前时间差值大于超时时间返回{@code null}，否则返回值。
     * <p>
     * 每次调用此方法会可选是否刷新最后访问时间，{@code true}表示会重新计算超时时间。
     *
     * @param key                键
     * @param isUpdateLastAccess 是否更新最后访问时间，即重新计算超时时间。
     * @return 键对应的对象
     */

// V get(K key, boolean isUpdateLastAccess);


    /**
     * 从缓存中清理过期对象，清理策略取决于具体实现
     *
     * @return 清理的缓存对象个数
     */
    prune(): number;

    /**
     * 缓存是否已满，仅用于有空间限制的缓存对象
     *
     * @return 缓存是否已满，仅用于有空间限制的缓存对象
     */
    isFull(): boolean;

    /**
     * 从缓存中移除对象
     *
     * @param key 键
     */
    remove(key: K): void;

    /**
     * 清空缓存
     */
    clear(): void;

    /**
     * 缓存的对象数量
     *
     * @return 缓存的对象数量
     */
    size(): number;

    /**
     * 缓存是否为空
     *
     * @return 缓存是否为空
     */
    isEmpty(): boolean;

    /**
     * 是否包含key
     *
     * @param key KEY
     * @return 是否包含key
     */
    containsKey(key: K): boolean;
}